Generated by Cython 3.0.2

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: sr_3D_radial_gradient_convergence.c

+001: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=False, autogen_pxd=True
  __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 002: 
 003: from libc.math cimport sqrt, fabs, exp, isnan, floor
 004: 
 005: from ..transform.interpolation_catmull_rom cimport _interpolate, Interpolator
+006: from ..transform.interpolation_fft_zoom import magnify as fft_zoom
  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_n_s_magnify);
  __Pyx_GIVEREF(__pyx_n_s_magnify);
  if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_magnify)) __PYX_ERR(0, 6, __pyx_L1_error);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_transform_interpolation_fft_zoom, __pyx_t_7, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_magnify); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fft_zoom, __pyx_t_7) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+007: from ..transform.image_magnify import cv2_zoom as zoom
  __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_s_cv2_zoom);
  __Pyx_GIVEREF(__pyx_n_s_cv2_zoom);
  if (__Pyx_PyList_SET_ITEM(__pyx_t_4, 0, __pyx_n_s_cv2_zoom)) __PYX_ERR(0, 7, __pyx_L1_error);
  __pyx_t_7 = __Pyx_Import(__pyx_n_s_transform_image_magnify, __pyx_t_4, 2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_7, __pyx_n_s_cv2_zoom); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_zoom, __pyx_t_4) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+008: from ..utils.timeit import timeit2
  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_n_s_timeit2);
  __Pyx_GIVEREF(__pyx_n_s_timeit2);
  if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_timeit2)) __PYX_ERR(0, 8, __pyx_L1_error);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_utils_timeit, __pyx_t_7, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_timeit2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_timeit2, __pyx_t_7) < 0) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 009: 
 010: 
+011: import numpy as np
  __pyx_t_4 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_4) < 0) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 012: cimport numpy as np
 013: 
 014: from cython.parallel import prange
 015: 
+016: cdef float Gx_Gy_MAGNIFICATION = 2.0
  __pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION = 2.0;
 017: 
 018: cdef extern from "_c_gradients.h":
 019:     void _c_gradient_3d(float* image, float* imGx, float* imGy, float* imGz, int d, int h, int w) nogil
 020: 
+021: cdef class RadialGradientConvergence3D:
struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D {
  PyObject_HEAD
  struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_vtab;
  int magnification;
  float fwhm;
  float sensitivity;
  float tSS;
  float tSO;
  int doIntensityWeighting;
};
/* … */
struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D {
  void (*_single_frame_RGC_map)(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice);
  void (*_calculate_3d_gradient)(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice);
  float (*_calculate_3d_RGC)(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *, int, int, int, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice);
  float (*_calculateDW)(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *, float);
  float (*_calculateDk)(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *, float, float, float, float, float, float, float);
};
static struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_vtabptr_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D;

 022: 
 023:     cdef int magnification
 024:     cdef float fwhm
 025:     cdef float sensitivity
 026:     cdef float tSS # two sigma squared
 027:     cdef float tSO # two sigma plus one
 028:     cdef bint doIntensityWeighting
 029: 
+030:     def __init__(self, magnification: int = 5, radius: float = 1.5, sensitivity: float = 1 , doIntensityWeighting: bool = True):
/* Python wrapper */
static int __pyx_pw_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D___init__, "\n         Calculate the Radial Gradient Convergence (RGC) of an image.\n         :param magnification: magnification of the image\n         :param radius: radius of the RGC (the PSF Full-Width-Half-Maximum)\n         :param sensitivity: sensitivity of the RGC (sharpening factor)\n         :param doIntensityWeighting: whether to do intensity weighting\n         ");
#if CYTHON_UPDATE_DESCRIPTOR_DOC
struct wrapperbase __pyx_wrapperbase_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D___init__;
#endif
static int __pyx_pw_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_magnification = 0;
  double __pyx_v_radius;
  double __pyx_v_sensitivity;
  PyObject *__pyx_v_doIntensityWeighting = 0;
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 30, __pyx_L3_error)
  #endif
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_magnification,&__pyx_n_s_radius,&__pyx_n_s_sensitivity,&__pyx_n_s_doIntensityWeighting,0};
  PyObject* values[4] = {0,0,0,0};
    values[0] = __Pyx_Arg_NewRef_VARARGS(__pyx_k__11);
    values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_True));
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_magnification);
          if (value) { values[0] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_radius);
          if (value) { values[1] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sensitivity);
          if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_doIntensityWeighting);
          if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 30, __pyx_L3_error)
      }
    } else {
      switch (__pyx_nargs) {
        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_magnification = ((PyObject*)values[0]);
    if (values[1]) {
      __pyx_v_radius = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_radius == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
    } else {
      __pyx_v_radius = ((double)1.5);
    }
    if (values[2]) {
      __pyx_v_sensitivity = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_sensitivity == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L3_error)
    } else {
      __pyx_v_sensitivity = ((double)1.0);
    }
    __pyx_v_doIntensityWeighting = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 4, __pyx_nargs); __PYX_ERR(0, 30, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_magnification), (&PyInt_Type), 0, "magnification", 1))) __PYX_ERR(0, 30, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D___init__(((struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self), __pyx_v_magnification, __pyx_v_radius, __pyx_v_sensitivity, __pyx_v_doIntensityWeighting);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D___init__(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, PyObject *__pyx_v_magnification, double __pyx_v_radius, double __pyx_v_sensitivity, PyObject *__pyx_v_doIntensityWeighting) {
  float __pyx_v_sigma;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_int_5)) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_int_5))) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_INCREF(__pyx_int_5);
  __pyx_k__11 = ((PyObject*)__pyx_int_5);
  __Pyx_GIVEREF(__pyx_int_5);
 031:         """
 032:          Calculate the Radial Gradient Convergence (RGC) of an image.
 033:          :param magnification: magnification of the image
 034:          :param radius: radius of the RGC (the PSF Full-Width-Half-Maximum)
 035:          :param sensitivity: sensitivity of the RGC (sharpening factor)
 036:          :param doIntensityWeighting: whether to do intensity weighting
 037:          """
+038:         self.magnification = magnification
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_magnification); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_v_self->magnification = __pyx_t_1;
+039:         self.fwhm = radius
  __pyx_v_self->fwhm = __pyx_v_radius;
+040:         self.sensitivity = sensitivity
  __pyx_v_self->sensitivity = __pyx_v_sensitivity;
+041:         self.doIntensityWeighting = doIntensityWeighting
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_doIntensityWeighting); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error)
  __pyx_v_self->doIntensityWeighting = __pyx_t_2;
 042: 
+043:         cdef float sigma = radius / 2.355
  __pyx_v_sigma = (__pyx_v_radius / 2.355);
+044:         self.tSS = 2 * sigma * sigma
  __pyx_v_self->tSS = ((2.0 * __pyx_v_sigma) * __pyx_v_sigma);
+045:         self.tSO = 2 * sigma + 1
  __pyx_v_self->tSO = ((2.0 * __pyx_v_sigma) + 1.0);
 046: 
+047:     @timeit2
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_3calculate(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_2calculate, "\n        Calculate the RGC of an image-stack.\n        :param im: the image to calculate the RGC of\n        :return: the RGC of the image\n        ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_3calculate = {"calculate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_3calculate, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_2calculate};
static PyObject *__pyx_pw_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_3calculate(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_im = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("calculate (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 47, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_im,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_im)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 47, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "calculate") < 0)) __PYX_ERR(0, 47, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_im = ((PyArrayObject *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("calculate", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 47, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D.calculate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_im), __pyx_ptype_5numpy_ndarray, 0, "im", 0))) __PYX_ERR(0, 48, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_2calculate(((struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self), __pyx_v_im);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_2calculate(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, PyArrayObject *__pyx_v_im) {
  npy_intp __pyx_v_nFrames;
  __Pyx_memviewslice __pyx_v_imRaw = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_imRad = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_imInt = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_imGx = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_imGy = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_imGz = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_n;
  int __pyx_v_p;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("calculate", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_30, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_31, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_32, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_33, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_34, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_35, 1);
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D.calculate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imRaw, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imRad, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imInt, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imGx, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imGy, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_imGz, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__24 = PyTuple_Pack(11, __pyx_n_s_self, __pyx_n_s_im, __pyx_n_s_nFrames, __pyx_n_s_imRaw, __pyx_n_s_imRad, __pyx_n_s_imInt, __pyx_n_s_imGx, __pyx_n_s_imGy, __pyx_n_s_imGz, __pyx_n_s_n, __pyx_n_s_p); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
/* … */
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_im, __pyx_kp_s_np_ndarray) < 0) __PYX_ERR(0, 47, __pyx_L1_error)
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D_3calculate, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RadialGradientConvergence3D_calc, NULL, __pyx_n_s_nanopyx_core_transform_sr_3D_rad, __pyx_d, ((PyObject *)__pyx_codeobj__25)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_7, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D, __pyx_n_s_calculate, __pyx_t_7) < 0) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  PyType_Modified(__pyx_ptype_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_timeit2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetNameInClass(__pyx_t_5, (PyObject *)__pyx_ptype_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D, __pyx_n_s_calculate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_9 = NULL;
  __pyx_t_10 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_9)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_9);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_10 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_5};
    __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 47, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D, __pyx_n_s_calculate, __pyx_t_7) < 0) __PYX_ERR(0, 47, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  PyType_Modified(__pyx_ptype_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D);
  __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_transform_sr_3D, __pyx_n_s_calculate, 47, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 47, __pyx_L1_error)
 048:     def calculate(self, im: np.ndarray):
 049:         """
 050:         Calculate the RGC of an image-stack.
 051:         :param im: the image to calculate the RGC of
 052:         :return: the RGC of the image
 053:         """
+054:         assert im.ndim == 4
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(__pyx_assertions_enabled())) {
    __pyx_t_1 = __pyx_f_5numpy_7ndarray_4ndim_ndim(__pyx_v_im); if (unlikely(__pyx_t_1 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L1_error)
    __pyx_t_2 = (__pyx_t_1 == 4);
    if (unlikely(!__pyx_t_2)) {
      __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
      __PYX_ERR(0, 54, __pyx_L1_error)
    }
  }
  #else
  if ((1)); else __PYX_ERR(0, 54, __pyx_L1_error)
  #endif
 055: 
+056:         nFrames = im.shape[0]
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L1_error)
  __pyx_v_nFrames = (__pyx_t_3[0]);
 057: 
+058:         cdef float [:,:,:,:] imRaw = im.astype(np.float32, copy=False)
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_im), __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float32); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6)) __PYX_ERR(0, 58, __pyx_L1_error);
  __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 58, __pyx_L1_error)
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_7, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_imRaw = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+059:         cdef float [:,:,:,:] imRad = np.zeros((im.shape[0], im.shape[1]*self.magnification, im.shape[2]*self.magnification, im.shape[3]*self.magnification), dtype=np.float32)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_zeros); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_7 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_5 = PyInt_FromSsize_t(((__pyx_t_3[1]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_4 = PyInt_FromSsize_t(((__pyx_t_3[2]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_9 = PyInt_FromSsize_t(((__pyx_t_3[3]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_5)) __PYX_ERR(0, 59, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_4)) __PYX_ERR(0, 59, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_t_9)) __PYX_ERR(0, 59, __pyx_L1_error);
  __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  __pyx_t_4 = 0;
  __pyx_t_9 = 0;
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_10);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_10)) __PYX_ERR(0, 59, __pyx_L1_error);
  __pyx_t_10 = 0;
  __pyx_t_10 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_imRad = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+060:         cdef float [:,:,:,:] imInt = np.zeros((im.shape[0], im.shape[1]*self.magnification, im.shape[2]*self.magnification, im.shape[3]*self.magnification), dtype=np.float32) # interpolated image
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error)
  __pyx_t_5 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error)
  __pyx_t_9 = PyInt_FromSsize_t(((__pyx_t_3[1]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error)
  __pyx_t_6 = PyInt_FromSsize_t(((__pyx_t_3[2]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_im); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error)
  __pyx_t_4 = PyInt_FromSsize_t(((__pyx_t_3[3]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5)) __PYX_ERR(0, 60, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_9)) __PYX_ERR(0, 60, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6)) __PYX_ERR(0, 60, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_4)) __PYX_ERR(0, 60, __pyx_L1_error);
  __pyx_t_5 = 0;
  __pyx_t_9 = 0;
  __pyx_t_6 = 0;
  __pyx_t_4 = 0;
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_7)) __PYX_ERR(0, 60, __pyx_L1_error);
  __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_float32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_9, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_imInt = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+061:         cdef float [:,:,:,:] imGx = np.zeros_like(imRaw) # Gradient of the interpolated image
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_zeros_like); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_imRaw, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_10 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_10)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_t_7};
    __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_9, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_imGx = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+062:         cdef float [:,:,:,:] imGy = np.zeros_like(imRaw)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros_like); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 62, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_imRaw, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_10)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_t_4};
    __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 62, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_9, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 62, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_imGy = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+063:         cdef float [:,:,:,:] imGz = np.zeros_like(imRaw)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 63, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_zeros_like); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_imRaw, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 63, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_10 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_10)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_t_7};
    __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 63, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(__pyx_t_9, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 63, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_imGz = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
 064: 
 065:         cdef int n
 066: 
+067:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+068:             for n in prange(nFrames):
        __pyx_t_11 = __pyx_v_nFrames;
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_n) lastprivate(__pyx_v_n)
                    #endif /* _OPENMP */
                    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                        {
                            __pyx_v_n = (int)(0 + 1 * __pyx_t_12);
+069:                 _c_gradient_3d(&imRaw[n,0,0,0], &imGx[n,0,0,0], &imGy[n,0,0,0], &imGz[n,0,0,0], imRaw.shape[1], imRaw.shape[2], imRaw.shape[3])
                            __pyx_t_14 = __pyx_v_n;
                            __pyx_t_15 = 0;
                            __pyx_t_16 = 0;
                            __pyx_t_17 = 0;
                            __pyx_t_18 = __pyx_v_n;
                            __pyx_t_19 = 0;
                            __pyx_t_20 = 0;
                            __pyx_t_21 = 0;
                            __pyx_t_22 = __pyx_v_n;
                            __pyx_t_23 = 0;
                            __pyx_t_24 = 0;
                            __pyx_t_25 = 0;
                            __pyx_t_26 = __pyx_v_n;
                            __pyx_t_27 = 0;
                            __pyx_t_28 = 0;
                            __pyx_t_29 = 0;
                            _c_gradient_3d((&(*((float *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRaw.data + __pyx_t_14 * __pyx_v_imRaw.strides[0]) ) + __pyx_t_15 * __pyx_v_imRaw.strides[1]) ) + __pyx_t_16 * __pyx_v_imRaw.strides[2]) ) + __pyx_t_17 * __pyx_v_imRaw.strides[3]) )))), (&(*((float *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGx.data + __pyx_t_18 * __pyx_v_imGx.strides[0]) ) + __pyx_t_19 * __pyx_v_imGx.strides[1]) ) + __pyx_t_20 * __pyx_v_imGx.strides[2]) ) + __pyx_t_21 * __pyx_v_imGx.strides[3]) )))), (&(*((float *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGy.data + __pyx_t_22 * __pyx_v_imGy.strides[0]) ) + __pyx_t_23 * __pyx_v_imGy.strides[1]) ) + __pyx_t_24 * __pyx_v_imGy.strides[2]) ) + __pyx_t_25 * __pyx_v_imGy.strides[3]) )))), (&(*((float *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGz.data + __pyx_t_26 * __pyx_v_imGz.strides[0]) ) + __pyx_t_27 * __pyx_v_imGz.strides[1]) ) + __pyx_t_28 * __pyx_v_imGz.strides[2]) ) + __pyx_t_29 * __pyx_v_imGz.strides[3]) )))), (__pyx_v_imRaw.shape[1]), (__pyx_v_imRaw.shape[2]), (__pyx_v_imRaw.shape[3]));
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 070: 
 071:         cdef int p
+072:         for p in range(nFrames):
  __pyx_t_13 = __pyx_v_nFrames;
  __pyx_t_12 = __pyx_t_13;
  for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_12; __pyx_t_1+=1) {
    __pyx_v_p = __pyx_t_1;
+073:             self._single_frame_RGC_map(imRaw[p,:,:,:], imRad[p,:,:,:], imInt[p,:,:,:], imGx[p,:,:,:], imGy[p,:,:,:], imGz[p,:,:,:])
    __pyx_t_30.data = __pyx_v_imRaw.data;
    __pyx_t_30.memview = __pyx_v_imRaw.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_30, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imRaw.strides[0];
        __pyx_t_30.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_30.shape[0] = __pyx_v_imRaw.shape[1];
__pyx_t_30.strides[0] = __pyx_v_imRaw.strides[1];
    __pyx_t_30.suboffsets[0] = -1;

__pyx_t_30.shape[1] = __pyx_v_imRaw.shape[2];
__pyx_t_30.strides[1] = __pyx_v_imRaw.strides[2];
    __pyx_t_30.suboffsets[1] = -1;

__pyx_t_30.shape[2] = __pyx_v_imRaw.shape[3];
__pyx_t_30.strides[2] = __pyx_v_imRaw.strides[3];
    __pyx_t_30.suboffsets[2] = -1;

__pyx_t_31.data = __pyx_v_imRad.data;
    __pyx_t_31.memview = __pyx_v_imRad.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_31, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imRad.strides[0];
        __pyx_t_31.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_31.shape[0] = __pyx_v_imRad.shape[1];
__pyx_t_31.strides[0] = __pyx_v_imRad.strides[1];
    __pyx_t_31.suboffsets[0] = -1;

__pyx_t_31.shape[1] = __pyx_v_imRad.shape[2];
__pyx_t_31.strides[1] = __pyx_v_imRad.strides[2];
    __pyx_t_31.suboffsets[1] = -1;

__pyx_t_31.shape[2] = __pyx_v_imRad.shape[3];
__pyx_t_31.strides[2] = __pyx_v_imRad.strides[3];
    __pyx_t_31.suboffsets[2] = -1;

__pyx_t_32.data = __pyx_v_imInt.data;
    __pyx_t_32.memview = __pyx_v_imInt.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_32, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imInt.strides[0];
        __pyx_t_32.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_32.shape[0] = __pyx_v_imInt.shape[1];
__pyx_t_32.strides[0] = __pyx_v_imInt.strides[1];
    __pyx_t_32.suboffsets[0] = -1;

__pyx_t_32.shape[1] = __pyx_v_imInt.shape[2];
__pyx_t_32.strides[1] = __pyx_v_imInt.strides[2];
    __pyx_t_32.suboffsets[1] = -1;

__pyx_t_32.shape[2] = __pyx_v_imInt.shape[3];
__pyx_t_32.strides[2] = __pyx_v_imInt.strides[3];
    __pyx_t_32.suboffsets[2] = -1;

__pyx_t_33.data = __pyx_v_imGx.data;
    __pyx_t_33.memview = __pyx_v_imGx.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_33, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imGx.strides[0];
        __pyx_t_33.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_33.shape[0] = __pyx_v_imGx.shape[1];
__pyx_t_33.strides[0] = __pyx_v_imGx.strides[1];
    __pyx_t_33.suboffsets[0] = -1;

__pyx_t_33.shape[1] = __pyx_v_imGx.shape[2];
__pyx_t_33.strides[1] = __pyx_v_imGx.strides[2];
    __pyx_t_33.suboffsets[1] = -1;

__pyx_t_33.shape[2] = __pyx_v_imGx.shape[3];
__pyx_t_33.strides[2] = __pyx_v_imGx.strides[3];
    __pyx_t_33.suboffsets[2] = -1;

__pyx_t_34.data = __pyx_v_imGy.data;
    __pyx_t_34.memview = __pyx_v_imGy.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_34, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imGy.strides[0];
        __pyx_t_34.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_34.shape[0] = __pyx_v_imGy.shape[1];
__pyx_t_34.strides[0] = __pyx_v_imGy.strides[1];
    __pyx_t_34.suboffsets[0] = -1;

__pyx_t_34.shape[1] = __pyx_v_imGy.shape[2];
__pyx_t_34.strides[1] = __pyx_v_imGy.strides[2];
    __pyx_t_34.suboffsets[1] = -1;

__pyx_t_34.shape[2] = __pyx_v_imGy.shape[3];
__pyx_t_34.strides[2] = __pyx_v_imGy.strides[3];
    __pyx_t_34.suboffsets[2] = -1;

__pyx_t_35.data = __pyx_v_imGz.data;
    __pyx_t_35.memview = __pyx_v_imGz.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_35, 1);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_imGz.strides[0];
        __pyx_t_35.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_35.shape[0] = __pyx_v_imGz.shape[1];
__pyx_t_35.strides[0] = __pyx_v_imGz.strides[1];
    __pyx_t_35.suboffsets[0] = -1;

__pyx_t_35.shape[1] = __pyx_v_imGz.shape[2];
__pyx_t_35.strides[1] = __pyx_v_imGz.strides[2];
    __pyx_t_35.suboffsets[1] = -1;

__pyx_t_35.shape[2] = __pyx_v_imGz.shape[3];
__pyx_t_35.strides[2] = __pyx_v_imGz.strides[3];
    __pyx_t_35.suboffsets[2] = -1;

((struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self->__pyx_vtab)->_single_frame_RGC_map(__pyx_v_self, __pyx_t_30, __pyx_t_31, __pyx_t_32, __pyx_t_33, __pyx_t_34, __pyx_t_35); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 73, __pyx_L1_error)
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_30, 1);
    __pyx_t_30.memview = NULL; __pyx_t_30.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_31, 1);
    __pyx_t_31.memview = NULL; __pyx_t_31.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_32, 1);
    __pyx_t_32.memview = NULL; __pyx_t_32.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_33, 1);
    __pyx_t_33.memview = NULL; __pyx_t_33.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_34, 1);
    __pyx_t_34.memview = NULL; __pyx_t_34.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_35, 1);
    __pyx_t_35.memview = NULL; __pyx_t_35.data = NULL;
  }
 074: 
+075:         return imRad, imInt, imGx, imGy, imGz
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_9 = __pyx_memoryview_fromslice(__pyx_v_imRad, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_imInt, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_imGx, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_10 = __pyx_memoryview_fromslice(__pyx_v_imGy, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_imGz, 4, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyTuple_New(5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_9)) __PYX_ERR(0, 75, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_7)) __PYX_ERR(0, 75, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_10);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_10)) __PYX_ERR(0, 75, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 4, __pyx_t_6)) __PYX_ERR(0, 75, __pyx_L1_error);
  __pyx_t_9 = 0;
  __pyx_t_4 = 0;
  __pyx_t_7 = 0;
  __pyx_t_10 = 0;
  __pyx_t_6 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;
 076: 
+077:     cdef void _single_frame_RGC_map(self, float[:,:,:] imRaw, float[:,:,:] imRad, float[:,:,:] imInt, float[:,:,:] imGx, float[:,:,:] imGy, float[:,:,:] imGz):
static void __pyx_f_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D__single_frame_RGC_map(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, __Pyx_memviewslice __pyx_v_imRaw, __Pyx_memviewslice __pyx_v_imRad, __Pyx_memviewslice __pyx_v_imInt, __Pyx_memviewslice __pyx_v_imGx, __Pyx_memviewslice __pyx_v_imGy, __Pyx_memviewslice __pyx_v_imGz) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_d;
  int __pyx_v_magnification;
  int __pyx_v_yM;
  int __pyx_v_xM;
  int __pyx_v_zM;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_single_frame_RGC_map", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D._single_frame_RGC_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 078:         """
 079:         Calculate the RGC map of an image frame.
 080:         :param imRaw: the frame to calculate the RGC map of
 081:         :param imRad: the RGC map of the frame (previously initialised as a 2D array the size of imRaw x magnification)
 082:         :param imInt: the interpolated image (previously initialised as a 2D array the size of imRaw x magnification)
 083:         :param imGx: the intensity gradients of the interpolated image in the horizontal direction (same size as imInt)
 084:         :param imGy: the intensity gradients of the interpolated image in the vertical direction (same size as imInt)
 085:         :return: the RGC of the image frame.
 086:         """
 087: 
+088:         cdef int w = imRaw.shape[2]
  __pyx_v_w = (__pyx_v_imRaw.shape[2]);
+089:         cdef int h = imRaw.shape[1]
  __pyx_v_h = (__pyx_v_imRaw.shape[1]);
+090:         cdef int d = imRaw.shape[0]
  __pyx_v_d = (__pyx_v_imRaw.shape[0]);
+091:         cdef int magnification = self.magnification
  __pyx_t_1 = __pyx_v_self->magnification;
  __pyx_v_magnification = __pyx_t_1;
 092:         cdef int yM, xM
 093: 
 094:         #TODO: interpolate 3D image
 095:         # cdef Interpolator interpolator = Interpolator(imRaw)
 096:         # imInt[:,:] = interpolator._magnify(self.magnification)
 097: 
 098:         # self._calculate_3d_gradient(imRaw, imGx, imGy, imGz) # calculate gradients of the interpolated image
 099: 
 100:         # with nogil:
+101:         for zM in range(magnification, d * magnification):
  __pyx_t_1 = (__pyx_v_d * __pyx_v_magnification);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v_magnification; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_zM = __pyx_t_3;
+102:             for yM in range(magnification, h * magnification):
    __pyx_t_4 = (__pyx_v_h * __pyx_v_magnification);
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = __pyx_v_magnification; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_yM = __pyx_t_6;
+103:                 for xM in range(magnification, w * magnification):
      __pyx_t_7 = (__pyx_v_w * __pyx_v_magnification);
      __pyx_t_8 = __pyx_t_7;
      for (__pyx_t_9 = __pyx_v_magnification; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
        __pyx_v_xM = __pyx_t_9;
+104:                     if self.doIntensityWeighting:
        if (__pyx_v_self->doIntensityWeighting) {
/* … */
          goto __pyx_L9;
        }
+105:                         imRad[zM, yM, xM] = self._calculate_3d_RGC(xM, yM, zM, imGx, imGy, imGz) * imInt[zM, yM, xM]
          __pyx_t_10 = ((struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self->__pyx_vtab)->_calculate_3d_RGC(__pyx_v_self, __pyx_v_xM, __pyx_v_yM, __pyx_v_zM, __pyx_v_imGx, __pyx_v_imGy, __pyx_v_imGz); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 105, __pyx_L1_error)
          __pyx_t_11 = __pyx_v_zM;
          __pyx_t_12 = __pyx_v_yM;
          __pyx_t_13 = __pyx_v_xM;
          __pyx_t_14 = __pyx_v_zM;
          __pyx_t_15 = __pyx_v_yM;
          __pyx_t_16 = __pyx_v_xM;
          *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRad.data + __pyx_t_14 * __pyx_v_imRad.strides[0]) ) + __pyx_t_15 * __pyx_v_imRad.strides[1]) ) + __pyx_t_16 * __pyx_v_imRad.strides[2]) )) = (__pyx_t_10 * (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imInt.data + __pyx_t_11 * __pyx_v_imInt.strides[0]) ) + __pyx_t_12 * __pyx_v_imInt.strides[1]) ) + __pyx_t_13 * __pyx_v_imInt.strides[2]) ))));
 106:                     else:
+107:                         imRad[zM, yM, xM] = self._calculate_3d_RGC(xM, yM, zM, imGx, imGy, imGz)
        /*else*/ {
          __pyx_t_10 = ((struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self->__pyx_vtab)->_calculate_3d_RGC(__pyx_v_self, __pyx_v_xM, __pyx_v_yM, __pyx_v_zM, __pyx_v_imGx, __pyx_v_imGy, __pyx_v_imGz); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error)
          __pyx_t_13 = __pyx_v_zM;
          __pyx_t_12 = __pyx_v_yM;
          __pyx_t_11 = __pyx_v_xM;
          *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRad.data + __pyx_t_13 * __pyx_v_imRad.strides[0]) ) + __pyx_t_12 * __pyx_v_imRad.strides[1]) ) + __pyx_t_11 * __pyx_v_imRad.strides[2]) )) = __pyx_t_10;
        }
        __pyx_L9:;
      }
    }
  }
 108: 
 109: 
+110:     cdef void _calculate_3d_gradient(self, float[:,:,:] image, float[:,:,:] imGx, float[:,:,:] imGy, float[:,:,:] imGz):
static void __pyx_f_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D__calculate_3d_gradient(CYTHON_UNUSED struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, __Pyx_memviewslice __pyx_v_image, __Pyx_memviewslice __pyx_v_imGx, __Pyx_memviewslice __pyx_v_imGy, __Pyx_memviewslice __pyx_v_imGz) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_d;
  float __pyx_v_ip0;
  float __pyx_v_ip1;
  float __pyx_v_ip2;
  float __pyx_v_ip3;
  float __pyx_v_ip4;
  float __pyx_v_ip5;
  float __pyx_v_ip6;
  float __pyx_v_ip7;
  int __pyx_v_z_i;
  int __pyx_v_y_i;
  int __pyx_v_x_i;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_calculate_3d_gradient", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
+111:         cdef int w = image.shape[2]
  __pyx_v_w = (__pyx_v_image.shape[2]);
+112:         cdef int h = image.shape[1]
  __pyx_v_h = (__pyx_v_image.shape[1]);
+113:         cdef int d = image.shape[0]
  __pyx_v_d = (__pyx_v_image.shape[0]);
 114: 
 115:         cdef float ip0, ip1, ip2, ip3, ip4, ip5, ip6, ip7
 116: 
 117:         cdef int z_i, y_i, x_i
 118: 
+119:         for z_i in range(d-1):
  __pyx_t_1 = (__pyx_v_d - 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_z_i = __pyx_t_3;
+120:             for y_i in range(h-1):
    __pyx_t_4 = (__pyx_v_h - 1);
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_y_i = __pyx_t_6;
+121:                 for x_i in range(w-1):
      __pyx_t_7 = (__pyx_v_w - 1);
      __pyx_t_8 = __pyx_t_7;
      for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
        __pyx_v_x_i = __pyx_t_9;
+122:                     ip0 = image[z_i, y_i, x_i]
        __pyx_t_10 = __pyx_v_z_i;
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_12 = __pyx_v_x_i;
        __pyx_v_ip0 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_10 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_12 * __pyx_v_image.strides[2]) )));
+123:                     ip1 = image[z_i, y_i, x_i + 1]
        __pyx_t_12 = __pyx_v_z_i;
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_10 = (__pyx_v_x_i + 1);
        __pyx_v_ip1 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_12 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_10 * __pyx_v_image.strides[2]) )));
+124:                     ip2 = image[z_i, y_i + 1, x_i]
        __pyx_t_10 = __pyx_v_z_i;
        __pyx_t_11 = (__pyx_v_y_i + 1);
        __pyx_t_12 = __pyx_v_x_i;
        __pyx_v_ip2 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_10 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_12 * __pyx_v_image.strides[2]) )));
+125:                     ip3 = image[z_i, y_i + 1, x_i + 1]
        __pyx_t_12 = __pyx_v_z_i;
        __pyx_t_11 = (__pyx_v_y_i + 1);
        __pyx_t_10 = (__pyx_v_x_i + 1);
        __pyx_v_ip3 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_12 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_10 * __pyx_v_image.strides[2]) )));
+126:                     ip4 = image[z_i + 1, y_i, x_i]
        __pyx_t_10 = (__pyx_v_z_i + 1);
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_12 = __pyx_v_x_i;
        __pyx_v_ip4 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_10 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_12 * __pyx_v_image.strides[2]) )));
+127:                     ip5 = image[z_i + 1, y_i, x_i + 1]
        __pyx_t_12 = (__pyx_v_z_i + 1);
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_10 = (__pyx_v_x_i + 1);
        __pyx_v_ip5 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_12 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_10 * __pyx_v_image.strides[2]) )));
+128:                     ip6 = image[z_i + 1, y_i + 1, x_i]
        __pyx_t_10 = (__pyx_v_z_i + 1);
        __pyx_t_11 = (__pyx_v_y_i + 1);
        __pyx_t_12 = __pyx_v_x_i;
        __pyx_v_ip6 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_10 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_12 * __pyx_v_image.strides[2]) )));
+129:                     ip7 = image[z_i + 1, y_i + 1, x_i + 1]
        __pyx_t_12 = (__pyx_v_z_i + 1);
        __pyx_t_11 = (__pyx_v_y_i + 1);
        __pyx_t_10 = (__pyx_v_x_i + 1);
        __pyx_v_ip7 = (*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_12 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) ) + __pyx_t_10 * __pyx_v_image.strides[2]) )));
+130:                     imGx[z_i, y_i, x_i] = (ip1 + ip3 + ip5 + ip7 - ip0 - ip2 - ip4 - ip6) / 4
        __pyx_t_10 = __pyx_v_z_i;
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_12 = __pyx_v_x_i;
        *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGx.data + __pyx_t_10 * __pyx_v_imGx.strides[0]) ) + __pyx_t_11 * __pyx_v_imGx.strides[1]) ) + __pyx_t_12 * __pyx_v_imGx.strides[2]) )) = ((((((((__pyx_v_ip1 + __pyx_v_ip3) + __pyx_v_ip5) + __pyx_v_ip7) - __pyx_v_ip0) - __pyx_v_ip2) - __pyx_v_ip4) - __pyx_v_ip6) / 4.0);
+131:                     imGy[z_i, y_i, x_i] = (ip2 + ip3 + ip6 + ip7 - ip0 - ip1 - ip4 - ip5) / 4
        __pyx_t_12 = __pyx_v_z_i;
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_10 = __pyx_v_x_i;
        *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGy.data + __pyx_t_12 * __pyx_v_imGy.strides[0]) ) + __pyx_t_11 * __pyx_v_imGy.strides[1]) ) + __pyx_t_10 * __pyx_v_imGy.strides[2]) )) = ((((((((__pyx_v_ip2 + __pyx_v_ip3) + __pyx_v_ip6) + __pyx_v_ip7) - __pyx_v_ip0) - __pyx_v_ip1) - __pyx_v_ip4) - __pyx_v_ip5) / 4.0);
+132:                     imGz[z_i, y_i, x_i] = (ip4 + ip5 + ip6 + ip7 - ip0 - ip1 - ip2 - ip3) / 4
        __pyx_t_10 = __pyx_v_z_i;
        __pyx_t_11 = __pyx_v_y_i;
        __pyx_t_12 = __pyx_v_x_i;
        *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGz.data + __pyx_t_10 * __pyx_v_imGz.strides[0]) ) + __pyx_t_11 * __pyx_v_imGz.strides[1]) ) + __pyx_t_12 * __pyx_v_imGz.strides[2]) )) = ((((((((__pyx_v_ip4 + __pyx_v_ip5) + __pyx_v_ip6) + __pyx_v_ip7) - __pyx_v_ip0) - __pyx_v_ip1) - __pyx_v_ip2) - __pyx_v_ip3) / 4.0);
      }
    }
  }
 133: 
 134: 
+135:     cdef float _calculate_3d_RGC(self, int xM, int yM, int zM, float[:,:,:] imGx, float[:,:,:] imGy, float[:,:,:] imGz):
static float __pyx_f_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D__calculate_3d_RGC(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, int __pyx_v_xM, int __pyx_v_yM, int __pyx_v_zM, __Pyx_memviewslice __pyx_v_imGx, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_imGy, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_imGz) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_d;
  float __pyx_v_vx;
  float __pyx_v_vy;
  float __pyx_v_vz;
  float __pyx_v_Gx;
  float __pyx_v_Gy;
  float __pyx_v_Gz;
  float __pyx_v_dx;
  float __pyx_v_dy;
  float __pyx_v_dz;
  float __pyx_v_distance;
  float __pyx_v_distanceWeight;
  float __pyx_v_GdotR;
  float __pyx_v_Dk;
  float __pyx_v_xc;
  float __pyx_v_yc;
  float __pyx_v_zc;
  float __pyx_v_RGC;
  float __pyx_v_distanceWeightSum;
  int __pyx_v__start;
  int __pyx_v__end;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  float __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_calculate_3d_RGC", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("nanopyx.core.transform.sr_3D_radial_gradient_convergence.RadialGradientConvergence3D._calculate_3d_RGC", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+136:         cdef int w = imGx.shape[2]
  __pyx_v_w = (__pyx_v_imGx.shape[2]);
+137:         cdef int h = imGx.shape[1]
  __pyx_v_h = (__pyx_v_imGx.shape[1]);
+138:         cdef int d = imGx.shape[0]
  __pyx_v_d = (__pyx_v_imGx.shape[0]);
 139: 
 140:         cdef float vx, vy, vz, Gx, Gy, Gz
 141: 
 142:         cdef float dx, dy, dz
 143:         cdef float distance, distanceWeight, GdotR, Dk
 144: 
+145:         cdef float xc = (xM + 0.5) / self.magnification # subpixel in the centre
  __pyx_v_xc = ((__pyx_v_xM + 0.5) / ((double)__pyx_v_self->magnification));
+146:         cdef float yc = (yM + 0.5) / self.magnification # subpixel in the centre
  __pyx_v_yc = ((__pyx_v_yM + 0.5) / ((double)__pyx_v_self->magnification));
+147:         cdef float zc = (zM + 0.5) / self.magnification
  __pyx_v_zc = ((__pyx_v_zM + 0.5) / ((double)__pyx_v_self->magnification));
 148: 
+149:         cdef float RGC = 0 # Radial Gradient Convergence
  __pyx_v_RGC = 0.0;
+150:         cdef float distanceWeightSum = 0
  __pyx_v_distanceWeightSum = 0.0;
 151: 
+152:         cdef int _start = -(<int>(Gx_Gy_MAGNIFICATION * self.fwhm))
  __pyx_v__start = (-((int)(__pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION * __pyx_v_self->fwhm)));
+153:         cdef int _end = <int>(Gx_Gy_MAGNIFICATION * self.fwhm + 1)
  __pyx_v__end = ((int)((__pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION * __pyx_v_self->fwhm) + 1.0));
 154: 
 155:         cdef int i, j, k
 156: 
+157:         for k in range(_start, _end):
  __pyx_t_1 = __pyx_v__end;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v__start; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+158:             vz = (<int>(Gx_Gy_MAGNIFICATION * zc) + k) / Gx_Gy_MAGNIFICATION
    __pyx_v_vz = (((float)(((int)(__pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION * __pyx_v_zc)) + __pyx_v_k)) / __pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION);
 159: 
+160:             if 0 < vz <= d - 1:
    __pyx_t_4 = (0.0 < __pyx_v_vz);
    if (__pyx_t_4) {
      __pyx_t_4 = (__pyx_v_vz <= (__pyx_v_d - 1));
    }
    if (__pyx_t_4) {
/* … */
    }
  }
+161:                 for j in range(_start, _end):
      __pyx_t_5 = __pyx_v__end;
      __pyx_t_6 = __pyx_t_5;
      for (__pyx_t_7 = __pyx_v__start; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
        __pyx_v_j = __pyx_t_7;
+162:                     vy = (<int>(Gx_Gy_MAGNIFICATION * yc) + j) / Gx_Gy_MAGNIFICATION # position in continuous space
        __pyx_v_vy = (((float)(((int)(__pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION * __pyx_v_yc)) + __pyx_v_j)) / __pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION);
 163: 
+164:                     if 0 < vy <= h - 1:
        __pyx_t_4 = (0.0 < __pyx_v_vy);
        if (__pyx_t_4) {
          __pyx_t_4 = (__pyx_v_vy <= (__pyx_v_h - 1));
        }
        if (__pyx_t_4) {
/* … */
        }
      }
 165: 
+166:                         for i in range(_start, _end):
          __pyx_t_8 = __pyx_v__end;
          __pyx_t_9 = __pyx_t_8;
          for (__pyx_t_10 = __pyx_v__start; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
            __pyx_v_i = __pyx_t_10;
+167:                             vx = (<int>(Gx_Gy_MAGNIFICATION * xc) + i) / Gx_Gy_MAGNIFICATION # position in continuous space
            __pyx_v_vx = (((float)(((int)(__pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION * __pyx_v_xc)) + __pyx_v_i)) / __pyx_v_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_Gx_Gy_MAGNIFICATION);
 168: 
+169:                             if 0 < vx <= w - 1:
            __pyx_t_4 = (0.0 < __pyx_v_vx);
            if (__pyx_t_4) {
              __pyx_t_4 = (__pyx_v_vx <= (__pyx_v_w - 1));
            }
            if (__pyx_t_4) {
/* … */
            }
          }
 170: 
+171:                                 dx = vx - xc
              __pyx_v_dx = (__pyx_v_vx - __pyx_v_xc);
+172:                                 dy = vy - yc
              __pyx_v_dy = (__pyx_v_vy - __pyx_v_yc);
+173:                                 dz = vz - zc
              __pyx_v_dz = (__pyx_v_vz - __pyx_v_zc);
+174:                                 distance = sqrt(dx * dx + dy * dy + dz * dz)
              __pyx_v_distance = sqrt((((__pyx_v_dx * __pyx_v_dx) + (__pyx_v_dy * __pyx_v_dy)) + (__pyx_v_dz * __pyx_v_dz)));
 175: 
+176:                                 if distance != 0 and distance <= self.tSO:
              __pyx_t_11 = (__pyx_v_distance != 0.0);
              if (__pyx_t_11) {
              } else {
                __pyx_t_4 = __pyx_t_11;
                goto __pyx_L13_bool_binop_done;
              }
              __pyx_t_11 = (__pyx_v_distance <= __pyx_v_self->tSO);
              __pyx_t_4 = __pyx_t_11;
              __pyx_L13_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
 177:                                     #TODO: interpolate gradients in 3D
+178:                                     Gx = 1
                __pyx_v_Gx = 1.0;
+179:                                     Gy = 1
                __pyx_v_Gy = 1.0;
+180:                                     Gz = 1
                __pyx_v_Gz = 1.0;
 181: 
+182:                                     distanceWeight = self._calculateDW(distance)
                __pyx_t_12 = ((struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self->__pyx_vtab)->_calculateDW(__pyx_v_self, __pyx_v_distance); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 182, __pyx_L1_error)
                __pyx_v_distanceWeight = __pyx_t_12;
+183:                                     distanceWeightSum += distanceWeight
                __pyx_v_distanceWeightSum = (__pyx_v_distanceWeightSum + __pyx_v_distanceWeight);
+184:                                     GdotR = Gx*dx + Gy*dy + Gz*dz
                __pyx_v_GdotR = (((__pyx_v_Gx * __pyx_v_dx) + (__pyx_v_Gy * __pyx_v_dy)) + (__pyx_v_Gz * __pyx_v_dz));
 185: 
+186:                                     if GdotR < 0:
                __pyx_t_4 = (__pyx_v_GdotR < 0.0);
                if (__pyx_t_4) {
/* … */
                }
+187:                                         Dk = self._calculateDk(Gx, Gy, Gz, dx, dy, dz, distance)
                  __pyx_t_12 = ((struct __pyx_vtabstruct_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *)__pyx_v_self->__pyx_vtab)->_calculateDk(__pyx_v_self, __pyx_v_Gx, __pyx_v_Gy, __pyx_v_Gz, __pyx_v_dx, __pyx_v_dy, __pyx_v_dz, __pyx_v_distance); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 187, __pyx_L1_error)
                  __pyx_v_Dk = __pyx_t_12;
+188:                                         RGC += Dk * distanceWeight
                  __pyx_v_RGC = (__pyx_v_RGC + (__pyx_v_Dk * __pyx_v_distanceWeight));
+189:         RGC /= distanceWeightSum
  __pyx_v_RGC = (__pyx_v_RGC / __pyx_v_distanceWeightSum);
+190:         if RGC >= 0:
  __pyx_t_4 = (__pyx_v_RGC >= 0.0);
  if (__pyx_t_4) {
/* … */
    goto __pyx_L16;
  }
+191:             RGC = RGC ** self.sensitivity
    __pyx_v_RGC = powf(__pyx_v_RGC, __pyx_v_self->sensitivity);
 192:         else:
+193:             RGC = 0
  /*else*/ {
    __pyx_v_RGC = 0.0;
  }
  __pyx_L16:;
 194: 
+195:         return RGC
  __pyx_r = __pyx_v_RGC;
  goto __pyx_L0;
 196: 
 197: 
+198:     cdef float _calculateDW(self, float distance) nogil: # distance weight
static float __pyx_f_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D__calculateDW(struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, float __pyx_v_distance) {
  float __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+199:         return (distance * exp((-distance * distance) / self.tSS)) ** 4
  __pyx_r = pow((__pyx_v_distance * exp((((-__pyx_v_distance) * __pyx_v_distance) / __pyx_v_self->tSS))), 4.0);
  goto __pyx_L0;
 200: 
 201: 
+202:     cdef float _calculateDk(self, float Gx, float Gy, float Gz, float dx, float dy, float dz, float distance) nogil:
static float __pyx_f_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_27RadialGradientConvergence3D__calculateDk(CYTHON_UNUSED struct __pyx_obj_7nanopyx_4core_9transform_33sr_3D_radial_gradient_convergence_RadialGradientConvergence3D *__pyx_v_self, float __pyx_v_Gx, float __pyx_v_Gy, float __pyx_v_Gz, float __pyx_v_dx, float __pyx_v_dy, float __pyx_v_dz, float __pyx_v_distance) {
  double __pyx_v_Dk;
  float __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+203:         Dk = fabs(Gy * dz - Gz * dy - Gx * dz + Gz * dx + Gx * dy - Gy * dx) / sqrt(Gx * Gx + Gy * Gy + Gz * Gz)
  __pyx_v_Dk = (fabs(((((((__pyx_v_Gy * __pyx_v_dz) - (__pyx_v_Gz * __pyx_v_dy)) - (__pyx_v_Gx * __pyx_v_dz)) + (__pyx_v_Gz * __pyx_v_dx)) + (__pyx_v_Gx * __pyx_v_dy)) - (__pyx_v_Gy * __pyx_v_dx))) / sqrt((((__pyx_v_Gx * __pyx_v_Gx) + (__pyx_v_Gy * __pyx_v_Gy)) + (__pyx_v_Gz * __pyx_v_Gz))));
+204:         if isnan(Dk):
  __pyx_t_1 = isnan(__pyx_v_Dk);
  if (__pyx_t_1) {
/* … */
  }
+205:             Dk = distance
    __pyx_v_Dk = __pyx_v_distance;
+206:         Dk = 1 - Dk / distance # if 1: vector pointing exactly to the centre
  __pyx_v_Dk = (1.0 - (__pyx_v_Dk / ((double)__pyx_v_distance)));
+207:         return Dk
  __pyx_r = __pyx_v_Dk;
  goto __pyx_L0;